package cn.liujianbo.example.springbean.bean5;

import cn.liujianbo.example.springbean.bean5.component.AppConfig;
import cn.liujianbo.example.springbean.bean5.component.UserService;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

/**
 * @author 刘建波
 * @date 2021-10-11 23:21
 * bean的创建过程   初始化后（AOP)
 * 被代理类有接口  jdk动态代理
 * 没接口  cglib生成子类实现代理，被代理对象放在代理对象的target属性中
 *
 * 1. 启用AOP   @EnableAspectJAutoProxy
 * 2. @Aspect  @Component 声明切面
 * 3. @Before("execution(* UserService.*(..))") 声明切点、环绕方法
 */
public class Test {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        // 此时获取的 bean 是CGLIB代理生成的子类 bean , 此 bean 没有经历依赖注入环节，所依赖的其他bean都为null
        // 代理的子类bean中存放了target属性，即为被代理前创建的bean
        UserService userService = context.getBean("userService", UserService.class);
        // 执行此方法时，是代理子类重写的test()方法中调用 target.test()
        userService.test();
    }
}
